package com.aha.dataanalyzeandview.exception;

import org.springframework.ui.Model;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * @Program: springboothello
 * @Author: 努力就是魅力
 * @Since: 2018-11-19 10:46
 * Description:
 *     这是一个异常处理的类
 *
 *
 *     启动应用后，被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法，都会作用在 被 @RequestMapping 注解的方法上。
 *     \@ModelAttribute：在Model上设置的值，对于所有被 @RequestMapping 注解的方法中，都可以通过 ModelMap 获取，
 **/

@ControllerAdvice
public class MyControllerAdvice {

//
//    /**
//     * 全局异常捕获类， 所有的全局异常都会被捕获到
//     * @param ex
//     * @return
//     */
//    @ResponseBody
//    @ExceptionHandler(value = Exception.class)
//    public Map<String, Object> globalExceptionHandler(Exception ex){
//        Map<String, Object> map = new HashMap<>();
//        map.put("code",-1);
//        map.put("msg", ex.getMessage());
//        return map;
//    }
//
//
//    /**
//     * 自定义异常。
//     *   返回json数据
//     * @param ex
//     * @return
//     */
//    @ResponseBody
//    @ExceptionHandler(value = MyException.class)
//    public Map<String, Object> diyExceptionHandler(MyException ex){
//        Map<String, Object> map = new HashMap<>();
//        map.put("code",ex.getCode());
//        map.put("msg", ex.getMsg());
//        return map;
//    }



//    /**
//     * 自定义异常
//     *   如果不需要返回json数据，而要渲染某个页面模板返回给浏览器，那么MyControllerAdvice中可以这么实现：
//     *   然后，在 templates 目录下，添加 error.ftl（这里使用freemarker） 进行渲染：
//     * @param ex
//     * @return
//     */
//    @ExceptionHandler(value = MyException.class)
//    public ModelAndView myErrorHandler(MyException ex) {
//        ModelAndView modelAndView = new ModelAndView();
//        modelAndView.setViewName("error");
//        modelAndView.addObject("code", ex.getCode());
//        modelAndView.addObject("msg", ex.getMsg());
//        return modelAndView;
//    }


    /**
     * 应用到所有@RequestMapping注解方法，在其执行之前初始化数据绑定器
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {

    }


    /**
     * 把值绑定到Model中，使全局@RequestMapping可以获取到该值
     * @param model
     */
    @ModelAttribute
    public void addAttributes(Model model) {
        model.addAttribute("author", "nulijiushimeili");
    }


}
